
import java.util.InputMismatchException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Comparator;

public class Main {
  // 整数运算：请根据公式（ (1 + N) * N / 2 ）计算前N个自然数的和：
  private static void demo1() {
    int n = 100;
    int sum = (1 + n) * n / 2;
    System.out.printf("%s, %d%n", sum == 5050 ? "测试通过" : "测试失败", sum);
  }
  // 浮点数运算：计算出一元二次方程（ax ^ 2 + bx + c = 0）的两个解
  private static  void demo2() {
    double a = 1.0;
    double b = 3.0;
    double c = -4.0;
    double r1 = (-b + Math.sqrt(b * b - 4 * a * c)) / (2 * a);
    double r2 = (-b - Math.sqrt(b * b - 4 * a * c)) / (2 * a);
    System.out.printf("%s, %f, %f%n", r1 == 1 && r2 == -4 ? "测试通过" : "测试失败", r1, r2);
  }
  // 判断指定年龄是否是小学生（6～12岁）：
  private static void demo3() {
    int age = 7;
    boolean isPrimaryStudent = age >= 6 && age <= 12;
    System.out.printf("%s, %b%n", isPrimaryStudent ? "测试通过" : "测试失败", isPrimaryStudent);
  }
  // 判断下面输出的结果：
  private static void demo4() {
    String[] names = {"ABC", "XYZ", "zoo"};
    String s = names[1];
    names[1] = "cat";
    System.out.println(s); // s是"XYZ"还是"cat"?
  }
  // 根据输入计算体质指数BMI，并打印结果
  private static void demo5() {
    double weight = 0;
    double height = 0;
    try (Scanner scanner = new Scanner(System.in)) {
      // 读取字符串：scanner.nextLine()、整型：scanner.nextInt()、长整型：scanner.nextLong()、布尔值：scanner.nextBoolean()
      // 循环获取正确格式的体重输入
      while (true) {
        System.out.print("Input your weight(kg): ");
        try {
          weight = scanner.nextDouble();
          break;
        } catch (InputMismatchException e) {
          System.out.println("输入的体重格式不正确，请重新输入数字格式的体重值。");
          scanner.nextLine(); // 清除输入缓冲区中不符合要求的内容
        }
      }
      // 循环获取正确格式的身高输入
      while (true) {
        System.out.print("Input your height(m): ");
        try {
          height = scanner.nextDouble();
          break;
        } catch (InputMismatchException e) {
          System.out.println("输入的身高格式不正确，请重新输入数字格式的身高值。");
          scanner.nextLine(); // 清除输入缓冲区中不符合要求的内容
        }
      }
      // BMI = 体重(kg) / 身高(m)的平方
      double bmi = weight / Math.pow(height, 2);
      // 保留小数点后2位，避免浮点数精度问题
      bmi = Double.parseDouble(String.format("%.2f", bmi));
      if (bmi < 18.5) {
        System.out.println(bmi + "-过轻");
      } else if (bmi <= 25) {
        System.out.println(bmi + "-正常");
      } else if (bmi <= 28) {
        System.out.println(bmi + "-过重");
      } else if (bmi <= 32) {
        System.out.println(bmi + "-肥胖");
      } else {
        System.out.println(bmi + "-非常肥胖");
      }
    } catch (InputMismatchException e) {
        System.out.println("输入的格式不正确，请重新输入符合要求的数据。");
    }
  }
  // 使用switch实现一个简单的石头、剪子、布游戏。
  private static void demo6() {
    try (Scanner scanner = new Scanner(System.in)) {
      Map<Integer, String> map = new HashMap<>();
      map.put(0, "石头");
      map.put(1, "剪子");
      map.put(2, "布");

      int userInput;
      while (true) {
        System.out.print("请出拳(石头(0)、剪子(1)、布(2)): ");
        try {
          userInput = scanner.nextInt();
          if (userInput >= 0 && userInput <= 2) {
            break;
          } else {
            System.out.println("输入错误，请重新输入符合要求的数字。");
          }
        } catch (InputMismatchException e) {
          System.out.println("输入格式错误，请输入整数。");
          scanner.nextLine(); // 清除输入缓冲区中不符合要求的内容
        }
      }

      int computerInput = (int) (Math.random() * 3);
      String result;
      int diff = userInput - computerInput;
      if (diff == 0) {
        result = "平局";
      } else if (diff == 1 || diff == -2) {
        result = "你赢了";
      } else {
        result = "你输了";
      }

      System.out.println("电脑出：" + map.get(computerInput) + ", " + result);
    }
  }
  // 使用while计算从m到n的和
  private static void demo7() {
    int sum = 0;
		int m = 20;
		int n = 100;
    while (m <= n) {
      sum += m;
      m++;
    }
    System.out.println(sum);
  }
  // 使用do while循环计算从m到n的和
  private static void demo8() {
    int sum = 0;
    int m = 20;
    int n = 100;
    do {
      sum += m;
      m++;
    } while (m <= n);
    System.out.println(sum);
  }
  // for 循环练习题
  private static void demo9() {
    // 给定一个数组，请用for循环倒序输出每一个元素
    int[] ns = { 1, 4, 9, 16, 25 };
    for (int i= 0; i < ns.length; i++) {
      System.out.print(ns[i] + " ");
    }
    System.out.println();
    // 利用for each循环对数组每个元素求和
    int sum = 0;
    for (int n : ns) {
      sum += n;
    }
    System.out.println(sum);
    // 请利用for循环计算圆周率π
    double pi = 0;
    for (int i = 0; i < 10000000; i++) {
      pi += Math.pow(-1, i) / (2 * i + 1);
    }
    pi = pi * 4.0;
    System.out.println(pi);
  }

  // 请按倒序遍历数组并打印每个元素
  private static void demo10() {
    int[] ns = { 1, 4, 9, 16, 25 };
    // 倒序打印数组元素
    for (int i = ns.length - 1; i >= 0; i--) {
      System.out.print(ns[i] + " ");
    }
    System.out.println();
  }

  // 请思考如何实现对数组进行降序排序
  private static void demo11() {
    int[] ns = { 28, 12, 89, 73, 65, 18, 96, 50, 8, 36 };
    System.out.println(Arrays.toString(ns));
    Integer[] integerNs = Arrays.stream(ns).boxed().toArray(Integer[]::new);
    Arrays.sort(integerNs, Comparator.reverseOrder());
    if (Arrays.toString(integerNs).equals("[96, 89, 73, 65, 50, 36, 28, 18, 12, 8]")) {
      System.out.println("测试成功");
    } else {
      System.out.println("测试失败");
    }
  }

  // 使用二维数组可以表示一组学生的各科成绩，请计算所有学生的平均分：
  private static void demo12() {
    // 用二维数组表示的学生成绩:
    int[][] scores = {
      { 82, 90, 91 }, // 学生甲的语数英成绩
      { 68, 72, 64 }, // 学生乙的语数英成绩
      { 95, 91, 89 }, // ...
      { 67, 52, 60 },
      { 79, 81, 85 },
    };
    double average = 0;
    for (int i = 0; i < scores.length; i++) {
      double sum = 0;
      for (int j = 0; j < scores[i].length; j++) {
        sum += scores[i][j];
      }
      average += sum / scores[i].length;
    }
    average /= scores.length;
    if (Math.abs(average - 77.733333) < 0.000001) {
      System.out.println("测试成功");
    } else {
      System.out.println("测试失败");
    }
  }

  public static void main(String[] args) {
    // demo1();
    // demo2();
    // demo3();
    // demo4();
    // demo5();
    // demo6();
    // demo7();
    // demo8();
    // demo9();
    // demo10();
    // demo11();
    demo12();
  }
}